import QtQuick
import QtQuick3D
import QtQuickRO

import "../Actors"
import "./ControlComponnet"

TPSPlayerController{

    //设置角色朝向移动方向
    directionPolicy: CharacterDirectionController.FaceToMovement

    property vector3d baseMovement:Qt.vector3d(200, 400, 200)

    //角色当前可使用的交互物体
    property alias currentInteract:shared.currentInteract

    ROSharedObject{
        id:shared
        property InteractiveTrigger currentInteract:null
    }

    function triggerCurrentInteract(){
        if(currentInteract)
        {
            invokeMethod("triggerCurrentInteract_imp",[])
        }
    }

    function triggerCurrentInteract_imp(){
        if(currentInteract)
        {
            currentInteract.trigger()
        }
    }

    moveSpeed:{
        let ret = Qt.vector3d(baseMovement.x,baseMovement.y,baseMovement.z)

        if(running)
        {
            ret.x *= 2.0
            ret.z *= 2.0
        }

        return ret
    }

    property bool running//是否在奔跑

    Connections{
        target:input && input.mainMouseArea?input.mainMouseArea.Keys:null

        function onPressed(e)
        {
            if(!e.isAutoRepeat)
            {
                if(e.key === Qt.Key_Shift)
                {
                    running = true
                }

                if(e.key === Qt.Key_F)
                {
                    if(currentInteract)
                    {
                        triggerCurrentInteract()
                    }
                }
            }
        }

        function onReleased(e)
        {
            if(!e.isAutoRepeat)
            {
                if(e.key === Qt.Key_Shift)
                {
                    running = false
                }
            }
        }

    }


    //触碰武器并拿在手上
    /*
    *   角色碰到武器的触发器后将武器放在手上
    *   这里有两种做法：
    *   1.触碰处理发生在服务端，在服务端修改武器的parent为右手，之后通过属性同步机制同步给所有客户端
        使得所有客户端都拿起武器。但是这样做需要提前把武器的parent设置为同步属性。代码侵入性太强
        2.触碰处理发生在服务端，在服务端发送广播RPC给自己和所有客户端，在rpc内将武器parent设置为右手
        缺点是要保证所有玩家都加入关卡后才能正常生效，拿起武器后又加入到对局中的玩家就显示不正常了

        这里采用方法1
    */

    Connections{//处理碰撞事件
        target:character?character.characterController:null

        function onEnteredTriggerBody(body)
        {
            if(shared.role === ROSharedObject.Client)//碰撞箱处理仅发生在服务端
            {
                return
            }

            if(body instanceof InteractiveTrigger)
            {
                currentInteract = body
            }


//            if(body instanceof GrabTrigger)//这是一个抓取用的触发器
//            {
//                let actor = body.host//获取该触发器的主对象

//                if(actor instanceof PropBase)//这是个道具基座
//                {
//                    //限制只有道具基座上有道具并且玩家手里没道具的时候才会从基座上拿道具
//                    if(actor.source && !character.rightHandProp.source)
//                    {
//                        character.rightHandProp.source = actor.source//将道具基座的道具url复制到角色手上拿着的道具上
//                        actor.source = ""//将基座上的道具清空
//                    }
//                }
//            }
        }

        function onExitedTriggerBody(body)
        {
            if(body instanceof InteractiveTrigger)
            {
                if(currentInteract === body)
                {
                    currentInteract = null
                }
            }
        }

    }


    Item {
        id: __materialLibrary__
    }

}
